package org.jeecg.cn.edu.scau.vm.container.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.cn.edu.scau.vm.container.domain.VmContainer;
import org.jeecg.cn.edu.scau.vm.container.domain.VmContainerOperType;
import org.jeecg.cn.edu.scau.vm.container.response.CreateContainerResponse;
import org.jeecg.cn.edu.scau.vm.container.vo.VmContainerListVo;
import org.jeecg.cn.edu.scau.vm.container.vo.VmContainerVo;
import org.jeecg.cn.edu.scau.vm.image.domain.VmImage;
import org.jeecg.cn.edu.scau.vm.node.domain.VmNode;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.vo.LoginUser;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 用于负责平台业务,主要是通用业务的处理
 */
public interface VmContainerBizService extends IService<VmContainer> {
    /**
     * 返回容器相关数据(整体返回)
     *
     * @param page         分页参数
     * @param queryWrapper 查询参数
     * @return 具体数据
     */
    Page<VmContainerListVo> pageContainerDetail(Page<VmContainer> page, QueryWrapper<VmContainer> queryWrapper);


    /**
     * 创建容器业务
     *
     * @param vmContainerVo vmContainer容器基础信息
     * @return 返回提示消息
     */
    Result<String> createContainer(VmContainerVo vmContainerVo);

    /**
     * 创建容器业务
     *
     * @param vmImage       镜像信息
     * @param loginUser     用户信息
     * @param vmContainerVo 容器相关信息
     * @param vmNode        节点数据
     * @return 返回是否创建成功
     */
    Result<String> createContainer(VmImage vmImage, LoginUser loginUser, VmContainerVo vmContainerVo, VmNode vmNode);

    /**
     * 停止容器业务处理
     *
     * @param containerId 容器Id
     * @return 返回提示语
     */
    Result<String> stopContainer(String containerId);

    /**
     * 删除容器业务处理
     *
     * @param containerId 容器Id
     * @return 返回提示语
     */
    Result<String> removeContainer(String containerId);

    /**
     * 开启容器业务处理
     *
     * @param containerId 容器Id
     * @return 返回提示语
     */
    Result<String> startContainer(String containerId);

    /**
     * 更新容器状态
     *
     * @param id         容器ID
     * @param status     容器状态
     * @param updateTime 更新时间
     * @return 返回是否更新成功
     */
    boolean updateStatus(String id, Integer status, LocalDateTime updateTime);

    /**
     * 获取枚举值
     *
     * @return 枚举值对
     */
    Result<Map<Integer, String>> getContainerStatusEnum();


    /**
     * 当创建容器成功之后,执行处理程序
     *
     * @param response 返回的响应
     * @param vmImage  镜像信息,当传入为空时,需要重新查询
     */
    Boolean handleCreateContainerSuccess(CreateContainerResponse response, VmImage vmImage);

    /**
     * 查询某个容器可用的操作类型
     *
     * @param id 容器ID
     * @return 返回可用操作列表
     */
    List<VmContainerOperType> getOperationType(String id);

    /**
     * 根据容器ID获取数据
     *
     * @param containerId 容器实际ID
     * @return 返回实例数据
     */
    VmContainer getByContainerId(String containerId);

    /**
     * 通过节点ID查询所有荣往期
     *
     * @param nodeId 节点ID
     * @return 返回容器列表
     */
    List<VmContainer> getByNodeId(String nodeId);

    /**
     * 添加创建审核配置工单
     *
     * @param vmContainerVo 创建容器元数据信息
     * @return 返回提示信息
     */
    Result<String> createSpecialSchedule(VmContainerVo vmContainerVo);

    /**
     * 处理容器过期
     *
     * @param expireKey 容器对应的key
     */
    void handleContainerExpire(String expireKey);

    Result<String> stopContainer(String containerId, LoginUser loginUser);

    void removeContainerByContainerId(String containerId);

}
